package htw.renoir.vs.model;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

/**
 * Verwaltet den Datenbankzugriff auf das Videoarchiv.
 * 
 * @author	Thomas Schoenfeld
 * @version	20130227-01
 * 
 */
public class VideoDao
{
	
	private VideoDao()
	{
	}
	
	/**
	 * Loescht ein Video aus der Datenbank.
	 * 
	 * @param		Video			das zu loeschende Video
	 * @throws	Exception	eine Exception
	 */
	public static void delete( Video video )
	{
		Session session = null;
		
		try
		{
			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			if ( video instanceof Video )
			{
				session.delete( video );
				session.flush();
			}
			session.getTransaction().commit();
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
		finally
		{
			HibernateUtil.closeSession( session );
		}
	}
	
	/**
	 * Sucht ein Video anhand seines Primaerschluessels aus der Datenbank.
	 * 
	 * @param		id 	der Primaerschluessel
	 * @return	das gefundene Video oder null.
	 */
	public static Video get( int id )
	{
		Session session = null;
		
		try
		{
			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			Video video = ( Video ) session.get( Video.class, id );
			session.getTransaction().commit();
			return video;
		}
		catch ( Exception e )
		{
			e.printStackTrace();
			return null;
		}
		finally
		{
			HibernateUtil.closeSession( session );
		}
	}
	
	/**
	 * Gibt alle Videos als Liste aus der Datenbank zurueck.
	 * 
	 * @return alle Videos
	 */
	@SuppressWarnings( "unchecked" )
	public static List<Video> getList()
	{
		Session session = null;
		List<Video> resultList;
		String queryString = "SELECT v FROM Video v";
		
		try
		{
			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			
			Query q = session.createQuery( queryString );
			resultList = ( ArrayList<Video> ) q.list();
			session.getTransaction().commit();
			return resultList;
		}
		catch ( Exception e )
		{
			e.printStackTrace();
			return null;
		}
		finally
		{
			HibernateUtil.closeSession( session );
		}
	}
	
	/**
	 * Sucht das Video aus der Datenbank, dessen Titel dem Suchstring
	 * entspricht.
	 * 
	 * @param		titel	der gesuchte Titel
	 * @return				das gesuchte Video
	 */
	@SuppressWarnings( "unchecked" )
	public static List<Video> getList( String titel )
	{
		Session session = null;
		List<Video> resultList;
		String queryString = "SELECT v FROM Video v where v.titel like ?";
		
		try
		{
			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			
			Query q = session.createQuery( queryString );
			q.setString( 0, "%" + titel + "%" );
			resultList = ( ArrayList<Video> ) q.list();
			session.getTransaction().commit();
			return resultList;
		}
		catch ( Exception e )
		{
			e.printStackTrace();
			return null;
		}
		finally
		{
			HibernateUtil.closeSession( session );
		}
	}
	
	@SuppressWarnings( "unchecked" )
	public static List<Video> getList( String titel, String producer )
	{
		Session session = null;
		List<Video> resultList;
		String queryString = "SELECT v FROM Video v where v.titel like ? and v.producer = ?";
		
		try
		{
			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			
			Query q = session.createQuery( queryString );
			q.setString( 0, "%" + titel + "%" );
			q.setString( 1, "%" + producer + "%" );
			resultList = ( ArrayList<Video> ) q.list();
			session.getTransaction().commit();
			return resultList;
		}
		catch ( Exception e )
		{
			e.printStackTrace();
			return null;
		}
		finally
		{
			HibernateUtil.closeSession( session );
		}
	}
	
	/**
	 * Speichert ein neues Video in der Datenbank.</br>
	 * Diese Methode erkennt selbststaenndig,</br>
	 * ob ein Objekt neu in die Datenbank eingefuegt oder</br>
	 * dort aktualisiert werden muss.
	 * 
	 * @param video	das zu speichernde Video
	 */
	public static void saveVideo( Video video )
	{
		Session session = null;
		
		try
		{
			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			session.saveOrUpdate( video );
			session.getTransaction().commit();
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
		finally
		{
			HibernateUtil.closeSession( session );
		}
	}
}
